package main

import (
	"fmt"
)

func main() {
	sliceDemo_01()
	sliceDemo_02()
	sliceDemo_03()
	sliceDemo_04()
	sliceDemo_05()
	sliceDemo_06()
}

/**
 * 数组定义方式：var name [size]type
 * 切片定义方式：var name []type
 */
func sliceDemo_01() {
	var array = [5]int{1, 3, 5}
	for i := 0; i < 4; i++ {
		println(i, array[i])
	}
	fmt.Println()
	var slice01 []int        //切片定义
	slice01 = []int{2, 5, 8} //切片初始化
	for j := 0; j < len(slice01); j++ {
		println(j, slice01[j])
	}
	printSlice(slice01[1:])

	//var slice02 []string = make([]int, 10) //make创建长度是10的切片
	//slice03 := make([]int, 10, 20) //make长度为10 容量20的切片

}

func sliceDemo_02() {
	var slice02 []int = make([]int, 10) //make创建长度是10的切片
	slice02 = append(slice02, 3, 8, 2, 32)
	printSlice(slice02)
	slice03 := make([]int, 10, 10) //make长度为10 容量20的切片
	copy(slice03, slice02)
	slice03 = append(slice03, 66)
	printSlice(slice03)
}

/**
 *  切片指定索引终止值，切片中第3个值指定索引终止位
 */
func sliceDemo_03() {
	myarray := [5]int{1, 2, 3, 4, 5}
	fmt.Printf("myarray 的长度为：%d, 容量为：%d\n", len(myarray), cap(myarray))

	// 该切片没有第三个参数则终止值为数组容量即5，则切片长度是4
	mysli1 := myarray[1:3]
	fmt.Printf("mysli1 的长度为：%d, 容量为：%d\n", len(mysli1), cap(mysli1))
	fmt.Println(mysli1)

	//该切片的第三个参数4则指定切片的终止值为4，该切片的参数说明 1：切片起始索引，3：切片终止索引 4：切片终止值
	mysli2 := myarray[1:3:4]
	fmt.Printf("mysli2 的长度为：%d, 容量为：%d\n", len(mysli2), cap(mysli2))
	fmt.Println(mysli2)
}

func sliceDemo_04() {
	var numbers4 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	myslice := numbers4[4:6:8]
	fmt.Printf("myslice为 %d, 其长度为: %d\n", myslice, len(myslice))

	myslice = myslice[:cap(myslice)] // myslice 值为5 6 7 8
	fmt.Printf("myslice的第四个元素为: %d \n", myslice[3])
}

func sliceDemo_05() {
	a := []int{90, 73, 99}
	modify(a[:])
	printSlice(a)
}

func modify(sls []int) {
	sls[0] = 100
}

func modify1(arr *[3]int) {
	(*arr)[0] = 90
}

func sliceDemo_06() {
	a := [3]int{89, 90, 91}
	modify1(&a)
	fmt.Println(a)
}

/**
 * 打印切片
 */
func printSlice(slice []int) {
	fmt.Printf("slice len:%d,capacity:%d,content:%v \n", len(slice), cap(slice), slice)
}
